iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

昨天我們了解了 Nginx 的主要設定檔在做什麼,今天我們要來繼續談其他設定檔

  • /etc/nginx/conf.d/:
    • 這個目錄中的 .conf 檔案會自動被 Nginx 載入並生效。
      適合存放單一網站或簡單服務的設定檔,如反向代理、負載平衡等。
      直接將 .conf 檔案放在這裡就會啟用該配置,不需要額外的操作。
  • /etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/:
    • /sites-available/ 存放的是所有網站的設定檔,但它們不會自動啟用。
      如果你想啟用某個網站的設定,需建立一個連結到 /sites-enabled/:
sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled/

因為 /etc/nginx/conf.d/ 較為常用的關係,今天主要針對伺服器設定的細節來做介紹

靜態資源管理

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index.html ;
    }

    error_page 404 /404.html;
    location = /404.html {
        root /var/www/html;
    }

    error_page 500 503 /50x.html;
    location = /50x.html {
        root /var/www/html;
    }
}

在上面的設定檔中我們可以把每個大括號當成是一個區塊

  • listen
    • 指的是我們 Nginx 在 80 port 接受請求。因為 HTTP 的默認 port 是 80,代表當使用者輸入http://example.com 時,Nginx 就會收到這個請求並根據設定檔的路徑、頁面、錯誤頁面等設定來進行回復
  • server_name
    • 用來配對客戶端的請求域名,這樣可以讓同一台伺服器根據不同域名使用不同的設定。比如,你可以為 example.com 和 test.com 配置不同的 Nginx 設定,這時候就可以設定兩個 server 區塊。
  • server
    • server 是 Nginx 虛擬設定的核心。每個 server 區塊用來定義一個伺服器如何處理請求。
  • location
    • location 用來定義伺服器如何處理特定的 URL 路徑。這個區塊會去對 URL 做請求,然後執行相應的操作(如: 靜態文件、不同的 port 號等等)。
    • 以上面例子來說,當你今天的 server_name 設定為 example.com ,你去 call example.com/ ,它匹配到 /,就會將目錄導到 root 底下的 index.html 來顯示。
  • root
    • 這表示 Nginx 會從 root 目錄中查找要顯示的資源。
  • error_page
    • 指的是可以指定當資源回傳是不同的 error code 時,會顯示那個頁面。
    • 如上面例子,404 會跳轉到 /404.html,500 503 error 時會跳轉到 /50x.html。

它包含了一個網站或應用的基本配置信息,比如伺服器在哪個端口上監聽(listen)、接受的域名是什麼(server_name),還有它如何處理不同的路徑或錯誤的請求。

反向代理

server {
    listen 80;
    server_name example.com;
    
     location / {
        root /var/www/html;
        index.html ;
    }
    
    location /backend {
        proxy_pass http://localhost:8080;  
        proxy_set_header Host $host; # 將原始請求的 Host header 傳遞給伺服器。$host 變數代表請求中的主機名稱(如 example.com)。
        proxy_set_header X-Real-IP $remote_addr; # 將客戶端的 IP 地址傳遞給伺服器。$remote_addr 變數表示客戶端的 IP 地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 將請求的 X-Forwarded-For Header 設定為包含客戶端 IP 地址的列表,該列表包括經過的所有代理伺服器的 IP。
        
     location /order{
         proxy_pass http://localhost:7686; 
     }
      
    }
  • proxy_pass
    • 會將請求轉到伺服器,你可以透過設定不同的 port 來導到不同的伺服器或服務,在外部的使用者不會知道你的 /backend 是導到 8080 , /order 是導到 7686。

負載平衡

upstream backend_servers {
    server backend1.example.com;  # 第一個後端伺服器
    server backend2.example.com;  # 第二個後端伺服器
    server backend3.example.com;  # 第三個後端伺服器
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  • upstream:
    • upstream 用於定義一組伺服器(在這裡是 backend1、backend2 和 backend3),這樣可以將來自 Nginx 的請求,平衡到這些伺服器上。

    • 輪循(Round Robin):

      • Nginx 預設使用輪循演算法,它會依照順序將請求分到伺服器組中的每個伺服器。當一個請求進來時,第一個請求會發送到 backend1.example.com,第二個請求會發送到 backend2.example.com,第三個請求又回到 backend1.example.com,以此類推。
    • 靈活設定權重:

      upstream backend_servers {
          server backend1.example.com weight=3;  
          server backend2.example.com weight=2;  
          server backend3.example.com;            
      }
      
      • 除了依照順序輪流外,他也可以設定權重,假設你有 6 個請求到達 Nginx,這些請求的分配會是
        • backend1 會接收 3 個請求(因為它的權重是 3)
        • backend2 會接收 2 個請求(因為它的權重是 2)
        • backend3 會接收 1 個請求(因為它的權重是 1)

多伺服器設定

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend1.example.com;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name test.com;

    location / {
        proxy_pass http://backend2.example.com;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

這就是我們前面所說,可以設定多個伺服器不同設定,如為 example.com 和 test.com 配置不同的根目錄導向不同的頁面。像在工作中就有透過這個方法,讓客戶用不同的網域名稱存取到不同的資源。

其實除了這幾個功能外,他還有很多細節可以設定,像是快取,但礙於篇章問題,只挑了幾個我比較常用的出來做介紹,若大家還有興趣,可以在多多深入!


上一篇
Day-10 | 簡單上手 Nginx (1)
下一篇
Day-12 | gRPC v.s. Restful API
系列文
埋藏在後端工程下的地雷與寶藏30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言